# coding: utf8
from django.template.base import Node,Library

from django.utils.html import format_html
from django.template.context_processors import csrf

# 配置
from it.config import *

# 模型
from it.models import Tasks

# 时间库
import datetime

# 自定义工具库
from common.utils import time as t

register = Library()

class PostTokenNode(Node):
	# 重写父类Node, 渲染到视图
	def render(self, context):
		'''拼接请求路径和csrf_token作为session, 交由视图判断'''
		req = context.get('request')	# 全局视图渲染器context, 获取django.core.handlers.wsgi.WSGIRequest对象
		url_path = str(req.path)	# urlpath 如:/task/add/
		csrf_token = str(csrf(req).get('csrf_token'))	# csrf_token, django自带功能
		session = req.session		# session, 获取django.contrib.sessions.backends.cached_db.SessionStore对象
		post_token = '_'.join(['POST', url_path,csrf_token])
		session[post_token] = post_token
		session.set_expiry(60 * 30)	# 30分钟失效, 秒计算

		return format_html("<input type='hidden' name='post_token' value='{}' />", post_token)

@register.tag
def post_token(parser, token):
	'''parser, token必需要的两个参数名'''
	return PostTokenNode()	# 不用传递context, 由父类处理

@register.filter
def limit_problem(problem):
	'''限制问题字数'''
	if len(problem) > 20:
		return problem[:17]+'...'
	return problem

@register.filter
def cancel_status(status):
	'''
		-1: '已取消',
		0: '新的',
		1: '已受理',
		2: '已解决',
	'''
	# 只有新的和已受理 状态可以取消
	if -1<status<2:
		return ''
	return 'hidden'

@register.filter
def bgcolor(status):
	'''
		-1: '#CCC',
		0: '#000',
		1: '#99CCFF',
		2: '#459E00',
	:param status:
	:return: 状态码对应背景颜色
	'''
	return config['task']['color'][status]

from common.utils.captcha import CaptchaSession
class CaptchaSessionKeyNode(Node):
	# 重写父类Node, 渲染到视图
	def render(self, context):
		'''拼接请求路径和csrf_token作为session, 交由视图判断'''
		request = context.get('request')	# 全局视图渲染器context, 获取django.core.handlers.wsgi.WSGIRequest对象
		url_path = str(request.path)	# urlpath 如:/task/add/
		csrf_token = str(csrf(request).get('csrf_token'))	# csrf_token, django自带功能
		cs = CaptchaSession()
		captcha_session_key = cs.get_captcha_session_key(url_path, csrf_token)
		return format_html("<input type='hidden' name='captcha_session_key' value='{}' />",
						   captcha_session_key)

@register.tag
def captcha_session_key(parser, token):
	'''parser, token必需要的两个参数名'''
	return CaptchaSessionKeyNode()	# 不用传递context, 由父类处理

@register.filter
def status_selected(status, query_status):
	'''
		筛选条件的状态码 对比 所有状态码
		由于筛选条件的status 是unicode type
		状态码是 int type
		使用 {% ifequal 无法判断 %}
		使用自定义标签 统一下type 再比较
	'''
	return 'selected' if str(status) == str(query_status) else ''

@register.simple_tag()
def predict_accept_time(task, return_time = False):
	'''
		预计受理时间
		截至本次期望解决时间之前,最近一次的期望解决时间, 即上一个问题解决了, 方可受理本单
		如果 本次工单添加时间 大于 上次解决时间 按当前时间 计算
	'''
	nearest_tasks = Tasks.objects.filter(expect_time__lt=task.expect_time)\
		.order_by('-expect_time').all()
	nearest_expect_time = datetime.datetime.now()
	if len(nearest_tasks) > 0:	# 存在比自己更早的工单
		nearest_expect_time = nearest_tasks[0].expect_time
		if task.add_time > nearest_expect_time:
			nearest_expect_time = datetime.datetime.now()

	if return_time:
		return nearest_expect_time

	return t.mysql_time_to_datatime(nearest_expect_time, True)

@register.simple_tag()
def predict_resolved_time(task):
	'''
		预计解决时间
		预计受理时间 + 期望解决用时
	'''
	used_time = task.expect_time - task.add_time	# 用时
	start_time = predict_accept_time(task, True)	# 起始时间
	return t.mysql_time_to_datatime(start_time+used_time, True)
